近日,亚信安全应急响应中心监测到Nginx发布安全公告,修复了Nginx解析器中的一个DNS解析程序漏洞(CVE-2021-23017),由于函数ngx_resolver_copy()在处理DNS响应时出现了一个off-by-one错误(也称:单字节溢出),这种错误通常在当迭代太多或太少时出现,该漏洞只需网络攻击者伪造指定DNS服务器的UDP数据包就可以导致在堆分配的缓冲区中一个字节被覆盖。 所有配置解析器语法的实例都可以通过DNS响应(响应来自Nginx的DNS请求)来触发该漏洞。 特制数据包允许使用一个点字符(.’, 0x2E)覆盖下一个堆块元数据的最低有效字节,攻击者利用该漏洞,可以实现DDOS拒绝服务,甚至实现远程代码执行。由于Nginx中缺乏DNS欺骗缓解措施,并且在检查DNS事务ID之前调用了易受攻击的功能,因此远程攻击者可能能够通向中毒服务器注入受毒的DNS响应来利用此漏洞。
Nginx是高性能的异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存,其在全球web服务器中的占有率常年位居最高。
目前漏洞细节已被披露,亚信安全应急响应中心建议受影响的用户尽快升级,避免导致黑客攻击利用。
NGINX Open Source 1.20.1 (stable)
NGINX Open Source 1.21.0 (mainline)当Nginx配置中设置resolver时(如:resolver 127.0.0.1:8088),Nginx DNS解析器(core/ngx_resolver.c)可以通过DNS解析多个模块的主机名。Nginx中通过ngx_resolver_copy()调用来验证和解压缩DNS响应中的每个DNS域名,接收网络数据包作为输入和指向正在处理的名称的指针,并在成功后返回指向包含未压缩名称的新分配缓冲区的指针。调用整体上分两步完成:1)通过计算未压缩的域名大小的长度len并验证输入包的合法性,丢弃包含大于128个指针或包含超出输入缓冲区边界的域名。第1部分中的大小计算与第2部分中的未压缩的域名之间的不匹配,导致一个len的一个off-by-one错误,从而允许以一个字节为单位写一个点字符超出name->data的边界。当压缩名称的最后一部分包含一个指向NUL字节的指针时,就会发生计算错误。尽管计算步骤仅考虑标签之间的点,但每次处理标签并且接着的字符为非NUL时,解压缩步骤都会写入一个点字符。当标签后跟指向NUL字节的指针时,解压缩过程如下:
如果计算的大小恰好与堆块大小对齐,则超出范围的点字符将覆盖下一个堆块长度的元数据中的最低有效字节。这可能会直接导致下一个堆块的大小写入,但还会覆盖3个标志,从而导致PREV_INUSE被清除并且IS_MMAPPED被设置。
首先,Nginx必须发送了DNS请求,并且必须等待响应。然后,可以在DNS响应的多个部分进行投毒:通过使用多个中毒的QNAME,NAME或RDATA值制作响应,可以在处理响应时多次击中易受攻击的函数,从而有效地执行多次脱机写入。此外,当攻击者交付中毒的CNAME时,它将递归解析,在ngx_resolve_name_locked()调用ngx_strlow()(ngx_resolver.c:594)期间触发额外的OOB写入,并在ngx_resolver_dup()(ngx_resolver.c:790)和ngx_crc32_short()(ngx_resolver.c:596)期间触发额外的OOB读取。用于“example.net”请求的DNS响应示例负载,其中包含被污染的CNAME:
该POC中payload填充了足够的字节来覆盖next_chunk.mchunk_size带点的最低有效字节:
24字节的标签导致分配了24字节的缓冲区,该缓冲区填充有24字节+一个超出范围的点字符。目前官方已在最新版本中修复了该漏洞,请受影响的用户尽快升级版本进行防护,官方下载链接:http://nginx.org/en/download.html若相关用户暂时无法升级nginx至新版本,也可安装补丁进行修复:http://nginx.org/download/patch.2021.resolver.txt http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html
行业热点:
安全运营能力再进化,有效SOAR产品是关键
搞定高级威胁!2分钟看懂“威胁狩猎服务”实操过程
家底摸不清,安全要“抓瞎”!资产管理你搞定了吗?
亚信安全 “威胁狩猎服务” 开辟高级网络威胁治理新赛道
了解亚信安全,请点击“阅读原文”